package cz.vse.adventura.po1715.xforv00_forejt.hra;


import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import java.util.ArrayList;
import java.util.Collection;
import static cz.vse.adventura.po1715.xforv00_forejt.hra.Texty.*;

/*******************************************************************************
 * Třída {@code Rozhovor} obsahuje metody ve stavu rozhovoru. Uživatel se do něj
 * dostane po zadání příkazu mluv
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
public class Rozhovor
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
    //v jakém stavu je rozhovor
    private static boolean stav = false;

    //posluchači, kteří chtějí znát stav rozhovoru
    private static final Collection<IListener<Boolean>> listeners =
            new ArrayList<IListener<Boolean>>();
    
    //false, pokud úředník žádost ještě nevydal
    private static boolean dalŽádost = false;
    private static String osoba;
    private final static String VÍZUM = "vízum";
    private final static String NECHÁPE = "Nevím, co tím myslíte";
    private final static String
            UREDNIKpožaduje = "Musíte si vyplnit tuhle žádost." +
                "\nPak ji přineste spolu s cestovním pasem a fotografií." +
                 "\nCena za vízum je 400,-",
            ZADOST_STACI = "Jedna žádost vám musí stačit" +
                            "\nPotřebuji od vás předměty: " + " " + DVOUSTOVKA + " " +
                            DVOUSTOVKA + " " + VYPLN_ZADOST + " " +
                            FOTOGRAFIE + " " + PAS;
    private final static String PRODAVACKApodává =
            "Tak řekněte sýýýr" +
            "\n Pasová fotografie.. Bude to 100Kč";
    private static Předmět žádost = new Předmět(ZADOST);
    private final static String ŘEČ = "Co byste potřeboval(a)?";


//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
    /***************************************************************************
     * Zjistí, jestli probíhá rozhovor
     * @return stav rozhovoru
     */
    static boolean getStav() {
        return stav;
    }

//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

    /***************************************************************************
     * Začátek rozhovoru - vrátí úvodní řeč, která je pro obě postavy stejná
     *
     * @param název postavy
     * @return řeč
     */
    static String start(String postava)
    {
        stav = true;
        noticeListeners(stav);
        osoba = postava;
        String zpráva = osoba  + ": " + ŘEČ;
        return zpráva;

    }

    /***************************************************************************
     * Vrací reakci osoby na příkaz
     *
     * @param příkaz
     * @return reakce osoby na příkaz
     */
    static String reaguj(String příkaz) {
        stav = false;
        noticeListeners(stav);
        if (osoba.equalsIgnoreCase(UREDNIK)) {
            return reagujÚředník(příkaz);
        } else if (osoba.equalsIgnoreCase(PRODAVACKA)) {
            return reagujProdavačka(příkaz);
        } else {
            throw new IllegalStateException
                    ("\nRozhovor se ocitl v neočekávaném stavu." );
        }
    }

    
/***************************************************************************
     * Přidá zadaného posluchače do seznamu posluchačů,
     * kterým hra oznamuje začátek a konec rozhovoru.
     *
     * @param listener Přihlašovaný posluchač
     */
//    @Override
    static void addDialogListener(IListener<Boolean> listener)
    {
         listeners.add(listener);
    }

    /***************************************************************************
     * Odebere zadaného posluchače ze seznamu posluchačů,
     * kterým hra oznamuje začátek a konec rozhovoru.
     *
     * @param listener Odhlašovaný posluchač
     */
//    @Override
    static void removeDialogListener(IListener<Boolean> listener)
    {
         listeners.remove(listener);
    }

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Nebude vytvářet instance
     */
    private Rozhovor()
    {
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================

/***************************************************************************
     * Vrací reakci úředníka na příkaz  - doplňuje metodu reaguj(String příkaz)
     *
     * @param příkaz
     * @return reakce osoby na příkaz
     */
    private static String reagujÚředník (String příkaz) {
        if (příkaz.equalsIgnoreCase(VÍZUM)) {
            if (!dalŽádost){
                Hra.getHra().getActualPlace().polož(žádost);
                dalŽádost = true;
                return UREDNIKpožaduje;
            } else {
                return ZADOST_STACI;
            }
        } else {
            return NECHÁPE;
        }
    }



     /**************************************************************************
     * Vrací reakci prodavačky na příkaz  - doplňuje metodu reaguj(String příkaz)
     *
     * @param příkaz
     * @return reakce osoby na příkaz
     */
    private static String reagujProdavačka (String příkaz) {
        if (příkaz.equalsIgnoreCase(FOTOGRAFIE)) {
            return PRODAVACKApodává;
        } else {
            return NECHÁPE;
        }
    }

    /***************************************************************************
     * Upozorní posluchače na změnu stavu rozhovoru - jestli probíhá, nebo ne
     */
    static void noticeListeners(Boolean stav) {
        for (IListener<Boolean> listener : listeners) {
            listener.notice(stav);
        }
    }

//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Rozhovor inst = new Rozhovor();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
